查看原文
其他

一个Tomcat 如何部署多个项目?附多种解决方案及详细步骤!

民工哥 民工哥技术之路 2021-12-16

此文源自一次多年前面试的面试题,民工哥将它总结出来分享给大家,希望对大家有所帮助或者今后的面试中说不定会用的上。


首先,我们了解一下常见的Java Web服务器。

  • Tomcat:由Apache组织提供的一种Web服务器,提供对jsp和Servlet的支持。它是一种轻量级的javaWeb容器(服务器),也是当前应用最广的JavaWeb服务器(免费)。

  • Jboss:是一个遵从JavaEE规范的、开放源代码的、纯Java的EJB服务器,它支持所有的JavaEE规范(免费)。

  • GlassFish:由Oracle公司开发的一款JavaWeb服务器,是一款强健的商业服务器,达到产品级质量(应用很少,收费)。

  • Resin:是CAUCHO公司的产品,是一个非常流行的应用服务器,对servlet和JSP提供了良好的支持,性能也比较优良,resin自身采用JAVA语言开发(收费,应用比较多)。

  • WebLogic:是Oracle公司的产品,是目前应用最广泛的Web服务器,支持JavaEE规范,而且不断的完善以适应新的开发要求,适合大型项目(收费,用的不多,适合大公司)。


Tomcat就是实际环境中最常见的,很多时候,特别是像在平时的测试环境,经常会遇到多个项目同时测试的情况,所以,今天民工哥与大家来聊一聊如何在一个Tomcat服务下,同时部署多个应用项目。


1、不修改端口

大家都知道,应用项目是直接放在Tomcat webapps目录下面

[root@CentOS7-1 tomcat]# cd webapps/
[root@CentOS7-1 webapps]# ll
total 4
drwxr-x--- 16 root root 4096 Jun  4 03:07 docs
drwxr-x---  6 root root   83 Jun  4 03:07 examples
drwxr-x---  5 root root   87 Jun  4 03:07 host-manager
drwxr-x---  5 root root  103 Jun  4 03:07 manager
drwxr-x---  3 root root  283 Jun  4 03:07 ROOT

所以,我们在不修改端口的情况下,可以直接在此目录下新增多个项目目录,也可以直接将war包放在此目录下,由于测试环境,我们直接模拟war解压后的目录,用添加目录来替代。

[root@CentOS7-1 webapps]# mkdir test java
[root@CentOS7-1 webapps]# ls
docs examples host-manager java manager ROOT test

准备测试的首页文件

[root@CentOS7-1 webapps]# echo "this is a test" >test/test.html
[root@CentOS7-1 webapps]# echo "this is a java" >java/java.html
[root@CentOS7-1 webapps]# cat test/test.html
this is a test
[root@CentOS7-1 webapps]# cat java/java.html
this is a java

修改配置文件

<!-- test -->
    <Context path="test/" docBase="test" reloadable="true" />
    <Context path="java/" docBase="java" reloadable="true" />
     #增加上两行配置即可
      </Host>
    </Engine>
  </Service>
</Server>
"../conf/server.xml" 173L, 7744C

docBase属性: 指定Web应用的文件路径,可以是绝对路径,也可以给定相对路径

path属性: 指定访问该Web应用的URL入口。

reloadable属性: 若这个属性为true,tomcat服务器在运行状态下会监视WEB-INF/classes和WEB-INF/lib目录下class文件的改动,如果监测到class文件被更新,服务器会自动重新加载Web应用。

重启Tomcat服务,测试访问,结果如下:

部署成功。

注:配置文件中增加的配置步骤可以不做,直接跳过,不是必须要做的步骤。


2、修改端口

第二种修改端口的方法,其实是基于第一种方法做出的改良,在tomcat目录下创建多个webapps目录。

删除webapps目录下的java项目,并删除webapps1目录下test项目即可。

修改配置文件

server.xml已有第一个项目的配置信息,现在需要新增第二个项目的配置,在Server节点下,新增一个Service节点,第2个Service节点直接复制第1个Service内容修改即可。

<Service name="Catalina1">
    <!--The connectors can use a shared executor, you can define one or more named thread pools-->

    <Connector port="8081" protocol="HTTP/1.1"
               connectionTimeout="20000"
               redirectPort="8443" />
    <!-- A "Connector" using the shared thread pool-->

    <Engine name="Catalina1" defaultHost="localhost">

      <!-- Use the LockOutRealm to prevent attempts to guess user passwords
           via a brute-force attack -->
      <Realm className="org.apache.catalina.realm.LockOutRealm">
        <!-- This Realm uses the UserDatabase configured in the global JNDI
             resources under the key "UserDatabase". Any edits
             that are performed against this UserDatabase are immediately
             available for use by the Realm. -->
        <Realm className="org.apache.catalina.realm.UserDatabaseRealm"
               resourceName="UserDatabase"/>
      </Realm>

      <Host name="localhost"  appBase="webapps1"
            unpackWARs="true" autoDeploy="true">

        <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
               prefix="localhost_access_log" suffix=".txt"
               pattern="%h %l %u %t &quot;%r&quot; %s %b" />
      </Host>
    </Engine>
  </Service>

只需要注意修改几个配置即可,不太熟悉的读者,可以利用代码工具比较一下,就会发现两段配置的不同,这里就不多解释了。

  • Service的name属性修改为Catelina1;

  • http协议访问的Connector port属性修改为8081;

  • Engine的name属性修改为Catelina1;

  • Host的appBase属性修改为webapps1;

重启服务并测试访问

[root@CentOS7-1 conf]# ../bin/startup.sh
Using CATALINA_BASE: /usr/local/tomcat
Using CATALINA_HOME: /usr/local/tomcat
Using CATALINA_TMPDIR: /usr/local/tomcat/temp
Using JRE_HOME: /usr
Using CLASSPATH: /usr/local/tomcat/bin/bootstrap.jar:/usr/local/tomcat/bin/tomcat-juli.jar
Tomcat started.
[root@CentOS7-1 conf]# lsof -i :8080
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
java 2486 root 52u IPv6 25075      0t0 TCP *:webcache (LISTEN)
[root@CentOS7-1 conf]# lsof -i :8081
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
java 2486 root 57u IPv6 25079      0t0 TCP *:tproxy (LISTEN)
[root@CentOS7-1 conf]# curl http://127.0.0.1:8080/test/test.html
this is a test
[root@CentOS7-1 conf]# curl http://127.0.0.1:8081/java/java.html
this is a java



end


最新整理的 2TB 技术干货:包括架构师实战教程、大数据、Docker容器、系统运维、数据库、redis、MongoDB、电子书、Java基础课程、Java实战项目、ELK Stack、机器学习、BAT面试精讲视频等。只需在「 民工哥技术之路」微信公众号对话框回复关键字:1024 即可获取全部资料。 

精彩文章推荐:


民工哥熬夜一周撸完!1000+页学习资料免费分享给大家,提供下载!

服务端 TCP 连接的 TIME_WAIT 问题分析与解决

基于 Nginx+lua+Memcache 实现灰度发布

10 大白帽黑客专用的 Linux 操作系统

Linux 中实用但很小众的 11 个炫酷终端命令

Linus 给 AMD 带货,Intel 哭晕在厕所

好文章,朕在看」❤️↓↓↓

: . Video Mini Program Like ,轻点两下取消赞 Wow ,轻点两下取消在看

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存